package echecs.metier.jeu;

/** Packages utilis�s par ce package
 *  Au sein de ce projet, seul metier.plateau.*
 *                             metier.materiel.*  sont autoris�s
 */
import echecs.metier.plateau.*;
import echecs.metier.materiel.*;

/**
 * Titre :
 * Description :
 * Copyright :    Copyright (c) 2002
 * Soci�t� : Fabrice Tranchand
 * @author Fabrice Tranchand
 * @version 1.0
 */

public class Coup
{
  // -----------------------------------------------------------------
  //     associations
  // -----------------------------------------------------------------
  /* joueur auteur du coup                                          */
  private Joueur auteur;
  /* case d'arriv�e de la piece deplacee                            */
  private Case caseArrivee;
  /* case de depart de la piece deplacee                            */
  private Case caseDepart;
  /* piece deplacee                                                 */
  private Piece piece;
  /* piece prise par la piece deplacee                              */
  private Piece piecePrise;
  /* l'echiquier                                                    */
  private Echiquier echiquier;




  // -----------------------------------------------------------------
  //     constructeur
  // -----------------------------------------------------------------
  // *****************************************************************
  //     le premier parametre designe l'auteur du coup
  //     le second parametre designe la piece qui est deplacee
  //     le troisieme parametre designe la case d'arrivee de cette piece
  //     le constructeur ne deplace pas les pieces
  // *****************************************************************
  public Coup(Echiquier echiquier_p,
              Joueur joueur_p,
              Piece piece_p,
              Case case_p)
  {
    echiquier = echiquier_p;
    auteur = joueur_p;
    piece = piece_p;
    piecePrise = (Piece)(case_p.getJeton());
    caseArrivee = case_p;
    caseDepart = piece.getPosition();
  }





  // ----------------------------------------------------------------
  //     les methodes publiques
  // ----------------------------------------------------------------
  // *****************************************************************
  //     retourne true si le coup est conforme au regles des echecs selon
  //     les regles suivantes :
  //        - le joueur deplace l'une de ses pieces
  //        - la case d'arrivee est libre ou occupee par une piece adverse
  //        - la piece se deplace conformement a son type
  // *****************************************************************
  //modif ajout de piecePrise.peutBouget()
  public boolean estValide()
  {
    boolean retour = true;
    if (! pieceCorrecte())retour = false;
    else if (! caseArriveeCorrecte())retour = false;
    else if (!piece.peutBouger(caseArrivee))retour = false;
    else{
    	retour = piece.ignoreObstacle() ||
        echiquier.intervalleLibre(caseDepart, caseArrivee);
    }
    return retour;
  }
  // *****************************************************************
  //     met a jour l'echiquier en deplacant la piece
  // *****************************************************************
  public void effectuer()
  {
    if (piecePrise != null){
    	piecePrise.enlever();
    }
    piece.bouger(caseArrivee);
  }
  // *****************************************************************
  //     annule le coup en replacant les pieces comme si le coup n'avait
  //     pas eu lieu
  // *****************************************************************
  //modif
  public void annuler()
  {
    piece.replacer(caseDepart);
    if(piecePrise != null){
    	piecePrise.replacer(caseArrivee);
    }
  }






  // ----------------------------------------------------------------
  //     les methodes privees
  // ----------------------------------------------------------------
  // *****************************************************************
  //     retourne true si la case d'arrivee est libre ou occupee par
  //     une piece adverse
  // *****************************************************************
  private boolean caseArriveeCorrecte()
  {
    return ( pieceBouge() && (! pieceDuJoueur()));
  }
  // *****************************************************************
  //     retourne true si la case d'arrivee est differente de la case
  //     de depart
  // *****************************************************************
  private boolean pieceBouge()
  {
    return caseArrivee != caseDepart;
  }
  // *****************************************************************
  //     retourne true si la case d'arrivee est occupee par une piece
  //     de l'auteur du coup
  // *****************************************************************
  private boolean pieceDuJoueur()
  {
    boolean retour = false;
    Piece pieceArrivee = (Piece)(caseArrivee.getJeton());
    if (pieceArrivee != null)
      retour = (pieceArrivee.getCouleur() == auteur.getCouleur());
    return retour;
  }
  // *****************************************************************
  //     retourne true si la piece jouee est sur l'echiquier et
  //     appartient a l'auteur du coup
  // *****************************************************************
  private boolean pieceCorrecte()
  {
    return ((piece != null) &&
            (piece.getCouleur() == auteur.getCouleur()));
  }
}
